# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect
from lr.work.models import Work, WorkRels, Page, Genre, WorkComments
from lr.register.models import Profile
from lr.message.models import LrMessage
from django.template.loader import render_to_string
from django.views.generic.simple import direct_to_template
from django.contrib.auth.models import User
from lr.work.forms import WorkRenameForm, WorkPublishForm
import datetime
from lr.cabinet.models import UserRels
from lr.events.models import LrEvent


def work(request):
    """ Обработчик запросов к произведению """
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')
    
    try:
        work_id = request.GET['id']
    except:
        # Не указан id произведения
        return HttpResponseRedirect('/')
    
    if 'action' in request.GET:
        action = request.GET['action']
        if action == 'add_page':
            return add_page(request, work_id)
        elif action == 'rename':
            return rename(request, work_id)
        elif action == 'remove':
            return remove(request, work_id)
        elif action == 'coauthors':
            return coauthors(request, work_id)
        elif action == 'trustee':
            return trustee(request, work_id)
        elif action == 'remove_page':
            try:
                page_index = request.GET['page']
                return remove_page(request, work_id, page_index)
            except:
                # Не указана удаляемая страница
                pass
        elif action == 'publish':
            return publish(request, work_id)
        elif action == 'edition':
            return new_edition(request, work_id)
    
    return HttpResponseRedirect('/')



def add_page(request, work_id):
    """ Добавить страницу """
    lst = list(_get_work(request, work_id))
    work = lst[0]
    is_coauthor = lst[2]
    is_master = (work.owner or work.author) == request.user
    if not is_master and not is_coauthor or not UserRels.check_rels(work.owner or work.author, request.user):
        # Этот пользователь не имеет права добавлять страницы
        return HttpResponseRedirect('/')
    
    pages = Page.objects.filter(work=work, edition=work.edition).order_by('index')
    pages_count = len(pages)
    if pages_count > 0:
        page_index = pages[pages_count - 1].index + 1
    else:
        page_index = 1
    
    Page.objects.createPage(work=work, index=page_index, edition=work.edition)
    return HttpResponseRedirect('table?edit=%d;page=%d' % (work.id, page_index))



def rename(request, work_id):
    """ Переименовать произведение """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может переименовать произведение
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_rename.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права переименовывать произведение
            return HttpResponseRedirect('/')

    if request.method == 'POST':
        form = WorkRenameForm(request.POST)
        if form.is_valid():
            try:
                genre_id = request.POST['genre']
                if genre_id:
                    work.genre = Genre.objects.get(id=genre_id)
                else:
                    work.genre = None
                work.title = request.POST['new_title']
                work.save()
            except:
                pass
            return HttpResponseRedirect('table?edit=%d' % work.id)
    else:
        if work.genre:
            genre_id = work.genre.id
        else:
            genre_id = ''
        form = WorkRenameForm({ 'genre': genre_id, 'new_title': work.title })
    
    work_data = {}
    work_data['work_title'] = work.title
    work_data['form'] = form
    return direct_to_template(request, 'work/work_rename.html', work_data)



def remove(request, work_id):
    """ Удалить произведение """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может удалять произведение
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_remove.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права удалять произведение
            return HttpResponseRedirect('/')
    
    if request.method == 'POST':
        if 'confirm' in request.POST \
        and bool(request.POST['confirm']):
            # Пользователь подтвердил удаление произведения
            work_comments = WorkComments.objects.filter(work=work)
            for comments in work_comments:
                comments.comments.delete()
            work.delete()
            return HttpResponseRedirect('table')
        else:
            # Пользователь не подтвердил удаление произведения
            return HttpResponseRedirect('table?edit=%d' % work.id)
    
    work_data = {}
    work_data['work_title'] = work.title
    return direct_to_template(request, 'work/work_remove.html', work_data)



def coauthors(request, work_id):
    """ Редактировать список соавторов """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может редактировать список соавторов
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_coauthors.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права редактировать список соавторов
            return HttpResponseRedirect('/')
    
    coa_list = None
    
    coauthors = WorkRels.objects.get(work=work).coauthors.all()
    if len(coauthors) > 0:
        coa_list = []
        for coauthor in coauthors:
            coa_list.append('<b><a href="cabinet?view=%d">%s</a></b> (%s)' % (coauthor.id, coauthor.username, Profile.get_user_name(user=coauthor)[0]))
    
    work_data = {}
    if request.method == 'POST' \
    and 'login' in request.POST \
    and 'operation' in request.POST:
        login = request.POST['login']
        operation = request.POST['operation']
        
        if operation == 'remove':
            try:
                coauthor = WorkRels.objects.get(work=work).coauthors.get(username=login)
                WorkRels.objects.get(work=work).coauthors.remove(coauthor)
                return HttpResponseRedirect('table?edit=%d' % work.id)
            except:
                work_data['login_error'] = u'Пользователь с таким логином не числится в списке соавторов'
        elif operation == 'add':
            try:
                coauthor = User.objects.get(username=login)
                if coauthor != request.user:
                    WorkRels.objects.get(work=work).coauthors.add(coauthor)
                return HttpResponseRedirect('table?edit=%d' % work.id)
            except:
                work_data['login_error'] = u'Пользователь с таким логином не зарегистрирован в Системе'
        work_data['login'] = login
    else:
        work_data['login'] = ''
    
    work_data['work_title'] = work.title
    work_data['coauthors'] = coa_list
    return direct_to_template(request, 'work/work_coauthors.html', work_data)



def trustee(request, work_id):
    """ Редактировать список доверенных лиц """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может редактировать список доверенных лиц
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_trustee.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права редактировать список доверенных лиц
            return HttpResponseRedirect('/')
    
    trust_list = None
    
    trustee = WorkRels.objects.get(work=work).trustee.all()
    if len(trustee) > 0:
        trust_list = []
        for trust in trustee:
            trust_list.append('<b><a href="cabinet?view=%d">%s</a></b> (%s)' % (trust.id, trust.username, Profile.get_user_name(user=trust)[0]))
    
    work_data = {}
    if request.method == 'POST' \
    and 'login' in request.POST \
    and 'operation' in request.POST:
        login = request.POST['login']
        operation = request.POST['operation']
        
        if operation == 'remove':
            try:
                trust = WorkRels.objects.get(work=work).trustee.get(username=login)
                WorkRels.objects.get(work=work).trustee.remove(trust)
                return HttpResponseRedirect('table?edit=%d' % work.id)
            except:
                work_data['login_error'] = u'Пользователь с таким логином не числится в списке доверенных'
        elif operation == 'add':
            try:
                trust = User.objects.get(username=login)
                if trust != request.user:
                    WorkRels.objects.get(work=work).trustee.add(trust)
                return HttpResponseRedirect('table?edit=%d' % work.id)
            except:
                work_data['login_error'] = u'Пользователь с таким логином не зарегистрирован в Системе'
        work_data['login'] = login
    else:
        work_data['login'] = ''
    
    work_data['work_title'] = work.title
    work_data['trustee'] = trust_list
    return direct_to_template(request, 'work/work_trustee.html', work_data)



def remove_page(request, work_id, page_index):
    """ Удалить указанную страницу """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может удалять страницы
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_remove_page.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права удалять страницы
            return HttpResponseRedirect('/')
    
    try:
        page = Page.objects.get(work=work, edition=work.edition, index=page_index)
        removed_index = page.index
        page.delete()
    except:
        # Удаляемой страницы не существует
        return HttpResponseRedirect('table?edit=%d' % work.id)
        
    pages = Page.objects.filter(work=work, edition=work.edition).order_by('index')
    if len(pages) == 0:
        # Была удалена последняя страница произведения, создать одну пустую страницу,
        # т. к. произведение не может не содержать страниц вовсе
        Page.objects.createPage(work=work, index=removed_index, edition=work.edition)
    else:
        # Перебрать все оставшиеся страницы и изменить индексы, чтобы следовали без разрывов
        current_index = removed_index
        last_page_removed = True
        for page in pages:
            if page.index > current_index:
                page.index = current_index
                current_index += 1
                page.save()
                last_page_removed = False
        if last_page_removed:
            removed_index = pages[0].index
    
    return HttpResponseRedirect('table?edit=%d;page=%d' % (work.id, removed_index))



def publish(request, work_id):
    """ Публиковать произведение """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может публиковать произведение
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_publish.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права публиковать произведение
            return HttpResponseRedirect('/')
    
    work_data = {}
    if request.method == 'POST':
        form = WorkPublishForm(request.POST)
        if form.is_valid():
            try:
                price = float(request.POST['price'].replace(u',', u'.'))
            except ValueError:
                price = 0.0
            try:
                view_price = float(request.POST['view_price'].replace(u',', u'.'))
            except:
                view_price = 0.0
            
            pub_first_time = work.status == u'draft'
            
            work.price = price
            work.view_price = view_price
            work.annotation = request.POST['annotation']
            work.status = request.POST['pub_type']
            work.signature = Profile.get_user_name(user=work.author, sign=True)[0]
            work.date = datetime.datetime.now()
            work.save()
            
            if pub_first_time and not work.contest:
                LrEvent.objects.create_event(render_to_string('events/pub_work.html', { 'work': work }))
                
            return HttpResponseRedirect('table?view=%d' % work.id)
    else:
        form = WorkPublishForm(initial=work)
    
    work_data['is_published'] = work.status != u'draft'
    work_data['work_title'] = work.title
    work_data['work_sign'] = Profile.get_user_name(user=work.author, sign=True)[0]
    work_data['work_edition'] = work.edition
    work_data['form'] = form
    return direct_to_template(request, 'work/work_publish.html', work_data)



def new_edition(request, work_id):
    """ Новая редакция произведения """
    work, is_author = _get_work(request, work_id)[:2]
    if work.owner:
        if work.owner != request.user:
            # У этого произведения есть правообладатель,
            # и только он может делать новые редакции произведения
            if is_author:
                # Выдать соответствующее сообщение для автора
                name = Profile.get_user_name(user=work.owner)[0]
                LrMessage.objects.create_message(request.user, u'Операция прервана',
                                                 render_to_string('messages/copyright_new_edition.html',
                                                                  { 'work_title': work.title, 'owner': name }))
            return HttpResponseRedirect('message')
    else:
        if not is_author:
            # Этот пользователь не имеет права делать новые редакции
            return HttpResponseRedirect('/')
    
    if request.method == 'POST':
        confirm = request.POST.get('confirm', False)
        if confirm:
            # Запрос на создание новой редакции
            edition = work.edition + 1
            
            pages = Page.objects.filter(work=work, edition=work.edition)
            for page in pages:
                page.clone(edition=edition)
                
            work.status = u'draft'
            work.edition = edition
            work.like = int(work.like / 2)
            work.dislike = int(work.dislike / 2)
            work.save()
            
            WorkComments.objects.createWorkComments(work, edition)
            return HttpResponseRedirect('table?edit=%d' % work.id)
        else:
            return HttpResponseRedirect('table?view=%d' % work.id)
    
    work_data = {}
    work_data['work_title'] = work.title
    return direct_to_template(request, 'work/work_new_edition.html', work_data)



def _get_work(request, work_id):
    """ Вспомогательная функция получения произведения и его доп. параметров """
    try:
        work = Work.objects.get(id=work_id)
        is_author = request.user == work.author
        is_coauthor = len(WorkRels.objects.filter(work=work, coauthors__id=request.user.id)) > 0
        return (work, is_author, is_coauthor)
    except:
        return (None, False, False)
